package utils;

import ucar.ma2.Array;
import ucar.nc2.Attribute;
import ucar.nc2.NetcdfFile;
import ucar.nc2.Variable;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//TODO:对文件夹里的文件类型进行过滤，因为这个工作其实挺烦的，特别是COSMIC数据文件含有较多的.符号，所以这里就不操作了。

/**
 * 该工具类针对FY-3C卫星的GNOS掩星数据和COSMIC数据进行数据提取
 * 提示：getVariablesLists()； getGlobalVariablesLists(),在这两个方法中，String vbName和int position
 * 是我根据目前（2020-8-13）的数据结构给定的，后续有可能国家卫星气象中心提供的数据可能会不一样（但是一般不会变得），可以自行修改
 * 提取数据包括：Global Attributes:掩星点坐标（经纬度），时间（年，月，日）
 * Attributes:海拔，温度，压强
 * 也可以根据自己需要提取其他相关参数，请自行配置
 * <p>
 * 重要提醒：！！！ 在实例化该工具类后，必须先实现getNcDataList()方法，这样写是为了实例化后少写代码。有利有弊
 * <p>
 * 涉及到了文件读，应该要有关闭操作,请在使用后添加.close（）进行关闭
 */
public class ReadAllNcDataUtils {

    private static List<File> fileList;
    private static NetcdfFile ncData;
    private static boolean isFyFile;

    public List<File> getFileList(String filepath) {
        File file = new File(filepath);
        File[] filesNames = file.listFiles();
        assert filesNames != null;
        return Arrays.asList(filesNames);
    }


    public List<NetcdfFile> getConditionNcDataList(List<String> filePathList) {
        List<NetcdfFile> mNc = new ArrayList<NetcdfFile>();
        isFyFile = filePathList.get(0).contains("FY");
        //System.out.println(isFyFile);
        for (String s : filePathList) {
            try {
                NetcdfFile open = NetcdfFile.open(s);
                mNc.add(open);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return mNc;
    }

    public List<NetcdfFile> getNcDataList(String filepath) {
        List<NetcdfFile> mNc = new ArrayList<NetcdfFile>();
        File file = new File(filepath);
        File[] filesNames = file.listFiles();
        assert filesNames != null;
        fileList = Arrays.asList(filesNames);
        //将读出的文件列表进行数据来源判断：①GNOS②COSMIC
        isFyFile = fileList.get(0).toString().contains("FY");
        for (File itemFile : fileList) {
            try {
                ncData = NetcdfFile.open(itemFile.getPath());
                mNc.add(ncData);

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return mNc;
    }


    /**
     * 获取掩星点纬度,
     * GNOS是11
     * COSMIC是24
     *
     * @return
     */
    public List<String> getRoLat(List<NetcdfFile> nf) {
        //随便起的名字，方便书写，想不到好名字，呜呜呜
        List<String> sb = new ArrayList<String>();
        return isFyFile ? getGlobalVariablesLists(11, sb, nf) : getGlobalVariablesLists(24, sb, nf);
        //return getGlobalVariablesLists(11, mLat);
    }

    /**
     * 获取掩星点经度
     * GNOS是12
     * COSMIC是
     *
     * @return
     */
    public List<String> getRoLon(List<NetcdfFile> nf) {
        List<String> sb = new ArrayList<String>();

        return isFyFile ? getGlobalVariablesLists(12, sb, nf) : getGlobalVariablesLists(25, sb, nf);
    }

    /**
     * 获取掩星事件发生年份
     * <p>
     * GNOS是0
     * COSMIC是3
     *
     * @return
     */
    public List<String> getRoYear(List<NetcdfFile> nf) {
        List<String> sb = new ArrayList<String>();
        return isFyFile ? getGlobalVariablesLists(0, sb, nf) : getGlobalVariablesLists(3, sb, nf);
    }

    /**
     * 获取掩星事件发生月份
     * GNOS是1
     * COSMIC是4
     *
     * @return
     */
    public List<String> getRoMonth(List<NetcdfFile> nf) {
        List<String> sb = new ArrayList<String>();
        return isFyFile ? getGlobalVariablesLists(1, sb, nf) : getGlobalVariablesLists(4, sb, nf);
    }

    /**
     * 获取掩星事件发生天
     * GNOS是2
     * COSMIC是5
     *
     * @return
     */
    public List<String> getRoDay(List<NetcdfFile> nf) {
        List<String> sb = new ArrayList<String>();
        return isFyFile ? getGlobalVariablesLists(2, sb, nf) : getGlobalVariablesLists(5, sb, nf);
    }

    /**
     * 获取掩星事件发生小时
     * GNOS是3
     * COSMIC是6
     *
     * @return
     */
    public List<String> getRoHour(List<NetcdfFile> nf) {
        List<String> sb = new ArrayList<String>();
        return isFyFile ? getGlobalVariablesLists(3, sb, nf) : getGlobalVariablesLists(6, sb, nf);
    }

    /**
     * 获取掩星事件发生分钟
     * GNOS是4
     * COSMIC是7
     *
     * @return
     */
    public List<String> getRoMinute(List<NetcdfFile> nf) {
        List<String> sb = new ArrayList<String>();
        return isFyFile ? getGlobalVariablesLists(4, sb, nf) : getGlobalVariablesLists(7, sb, nf);
    }

    /**
     * 获取掩星事件发生秒数
     * GNOS是5
     * COSMIC是8
     *
     * @return
     */
    public List<String> getRoSecond(List<NetcdfFile> nf) {
        List<String> sb = new ArrayList<String>();
        return isFyFile ? getGlobalVariablesLists(5, sb, nf) : getGlobalVariablesLists(8, sb, nf);
    }


    /**
     * 获得海拔
     * GNOS是 MSL_alt
     * COSMIC是MSL_alt
     *
     * @param
     * @return
     */
    public List<Array> getAltList(List<NetcdfFile> nf) {
        List<Array> mAltsList = new ArrayList<Array>();
        return getVariablesLists("MSL_alt", mAltsList, nf);
    }

    /**
     * 获得温度
     * GNOS是 Temp
     * COSMIC是Temp
     *
     * @param
     * @return
     */
    public List<Array> getTempList(List<NetcdfFile> nf) {
        List<Array> mTempsList = new ArrayList<Array>();
        return getVariablesLists("Temp", mTempsList, nf);
    }

    /**
     * 获得压强
     * GNOS是 Pres
     * COSMIC是Pres
     *
     * @param
     * @return
     */
    public List<Array> getPressList(List<NetcdfFile> nf) {
        List<Array> mPressList = new ArrayList<Array>();
        return getVariablesLists("Pres", mPressList, nf);
    }

    private static List<String> getGlobalVariablesLists(int position, List<String> mGlobalVb, List<NetcdfFile> nf) {
        for (NetcdfFile netcdfFile : nf) {
            List<Attribute> globalAttributes = netcdfFile.getGlobalAttributes();
            Array values = globalAttributes.get(position).getValues();
            String s = values.toString();
            mGlobalVb.add(s);
        }
        return mGlobalVb;
    }

    private static List<Array> getVariablesLists(String vbName,
                                                 List<Array> mVrsList, List<NetcdfFile> nf) {

        for (NetcdfFile netcdfFile : nf) {
            Array read = null;
            Variable sb = netcdfFile.findVariable(vbName);
            try {
                read = sb.read();

            } catch (IOException e) {
                e.printStackTrace();
            }

            mVrsList.add(read);

        }


        return mVrsList;
    }


}
